#include "fxcc/mono/CSharpLoader.h"

std::unordered_map<std::string, std::shared_ptr<mono::Behivor>> CSharpLoader::m_Behivors;

std::shared_ptr<mono::System> CSharpLoader::m_MonoSystem;

bool CSharpLoader::InitMono()
{
    if (!m_MonoSystem)
        m_MonoSystem = std::make_shared<mono::System>("mono system");

    return true;
}

bool CSharpLoader::LoadFile(const fxcc::File& file)
{

    switch (file.m_FileType)
    {
    case fxcc::_DLL_:
        return LoadFilePath(file.m_RelativePath).get();
    default:
        return false;
    }
}

std::shared_ptr<mono::Behivor> CSharpLoader::LoadFilePath(const std::string& path)
{
    auto it = m_Behivors.find(path);
    if (it != m_Behivors.end())
    {
        return it->second;
    }

    bool flag = m_MonoSystem->LoadBehivor(path);
    if (!flag)
    {
        ztclog::info("failed load the mono dll %s", path.c_str());
        return 0;
    }

    ztclog::info("[mono ] load dll %s", path.c_str());

    auto inst = m_MonoSystem->GetBehivor(path);
    m_Behivors[path] = inst;
    return inst;

}
